// pages/BLE/BLE.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    info:"",                //显示框
    devices:"",             //所有搜索到的蓝牙设备
    connectedDeviceId:"",   //连接上的设备的ID
    services: "" ,          //连接上设备的所有服务
    notifyCharacteristicsId: "0000FEE1-0000-1000-8000-00805F9B34FB", //响应UUID，根据蓝牙模块获得
    writeCharacteristicsId:  "0000FEE2-0000-1000-8000-00805F9B34FB", //写UUID， 根据蓝牙模块获得
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    
  },

  /****************1.蓝牙初始化***************/
  BLEInit(event)
  {
      var that = this;
      wx.openBluetoothAdapter
      ({
          success: function (res) 
          {
            console.log('初始化蓝牙适配器成功')
            that.setData
            ({
              info: '初始化蓝牙适配器成功'
            })
          },
          fail: function (res) 
          {
            console.log('请打开蓝牙和定位功能')
            that.setData
            ({
              info: '请打开蓝牙和定位功能'
            })
          }
      })
  },


  /****************2.获取蓝牙状态***************/
  BLEState(event)
  {
    var that = this;
    wx.getBluetoothAdapterState
    ({
        success: function (res) 
        {
          //打印相关信息
          console.log(JSON.stringify(res.errMsg) + "\n蓝牙是否可用：" + res.available);

          that.setData
          ({
              info: JSON.stringify(res.errMsg) +"\n蓝牙是否可用：" + res.available
          })
        },

        fail: function (res) 
        {
          //打印相关信息
          console.log(JSON.stringify(res.errMsg) + "\n蓝牙是否可用：" + res.available);

          that.setData
          ({
              info: JSON.stringify(res.errMsg) + "\n蓝牙是否可用：" + res.available
          })
        }
    })
 
  },


  /****************3.搜索设备**************/
  BLESearch(event)
  {
    var that = this;
    wx.startBluetoothDevicesDiscovery
    ({
        services: ['0000FEE0-0000-1000-8000-00805F9B34FB'], //如果填写了此UUID，那么只会搜索出含有这个UUID的设备，建议一开始先不填写
        success: function (res) 
        {
          that.setData
          ({
              info: "搜索设备" + JSON.stringify(res),
          })

          console.log('搜索设备返回' + JSON.stringify(res))
        }
    })
  },


  /****************4.获取蓝牙设备***************/
  BLEGetDevices(event)
  {
    var that = this;
    wx.getBluetoothDevices
    ({
        success: function (res) 
        {
          that.setData
          ({
            info: "设备列表\n" + JSON.stringify(res.devices),
            devices: res.devices
          })

          console.log('搜设备数目：' + res.devices.length)
          console.log('设备信息：\n' + JSON.stringify(res.devices)+"\n")
        }
    })
  },


   /****************5.连接蓝牙设备***************/
  BLEConnect(event)
  {
    var that = this;
    wx.createBLEConnection
    ({
      deviceId: event.target.id,
      success: function (res) 
      {
        console.log('调试信息：' + res.errMsg);
        that.setData
        ({
          connectedDeviceId: event.currentTarget.id,
          info: "MAC地址：" + event.currentTarget.id  + '  调试信息：' + res.errMsg,
        })
      },
      fail: function () 
      {
        console.log("连接失败");
      },
    })
  },


  /****************6.停止搜索蓝牙设备***************/
  BLESearchStop(event)
  {
    var that = this;
    wx.stopBluetoothDevicesDiscovery
    ({
      success: function (res) 
      {
        console.log("停止搜索" + JSON.stringify(res.errMsg));
        that.setData
        ({
          info: "停止搜索"  + JSON.stringify(res.errMsg),
        })
      }
    })
  },


  /****************7.获取服务service***************/
  BLEGetservice(event)
  {
    var that = this;
    wx.getBLEDeviceServices
    ({
      // 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
      deviceId: that.data.connectedDeviceId,

      success: function (res) 
      {
        console.log('services UUID:\n', JSON.stringify(res.services));
        for (var i = 0; i < res.services.length; i++) 
        {
          console.log("第"+(i+1) + "个UUID:" + res.services[i].uuid+"\n")
        }
        that.setData
        ({
          services: res.services,
          info: JSON.stringify(res.services),
        })
      }
    })
  },
 

  /****************8.获取所有的特征值***************/
  BLEGetCharacteristics(event)
  {
    var that = this;

    wx.getBLEDeviceCharacteristics
    ({
      // 这里的 deviceId 需要在上面的 getBluetoothDevices 中获取
      deviceId: that.data.connectedDeviceId,
      // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
      serviceId: that.data.services[0].uuid,

      success: function (res) 
      {
        console.log("%c getBLEDeviceCharacteristics", "color:red;");

        for (var i = 0; i < res.characteristics.length; i++) 
        {
          console.log('特征值：' + res.characteristics[i].uuid)
 
          if (res.characteristics[i].properties.notify) 
          {
              console.log("打印notifyCharacteristicsId")
              console.log(that.data.notifyCharacteristicsId)
          }

          if (res.characteristics[i].properties.write)
          {
              console.log("打印writeCharacteristicsId")
              console.log(that.data.writeCharacteristicsId)
          }
        }
        console.log('device getBLEDeviceCharacteristics:', JSON.stringify(res.characteristics));
      },

      fail: function () 
      {
        console.log("获取所有特征值失败");
      },
    })
  },


  /****************9.启用特征值变化***************/
  BLECharacteristicValueChange(event)
  {
    var that = this;

    console.log("启用的notifyCharacteristicsId", that.data.notifyCharacteristicsId);
 
    wx.notifyBLECharacteristicValueChange
    ({
      state: true,
      deviceId: that.data.connectedDeviceId,
      serviceId: that.data.services[0].uuid,
      characteristicId: that.data.notifyCharacteristicsId,

      success: function (res) 
      {
        console.log('notifyBLECharacteristicValueChange success', res.errMsg)
        var msg = '启动notify:' + res.errMsg
        that.setData({
          info: msg
        })
      },
      fail: function () 
      {
        console.log('启动notify:' + res.errMsg);
      },
      
    })
  },


  /****************10.接收蓝牙的返回数据***************/
  BLEDataRecieve(event)
  {
    var that = this;
    console.log("开始接收数据");

    wx.onBLECharacteristicValueChange
    (
      function (res) 
      {
        console.log("characteristicId：" + res.characteristicId)
        console.log("serviceId:" + res.serviceId)
        console.log("deviceId" + res.deviceId)
        console.log("Length:" + res.value.byteLength)
        console.log("hexvalue:" + ab2hex(res.value))
        that.setData
        ({
          info: that.data.info + ab2hex(res.value)
        })
      }
    )
  },

/****************11.蓝牙发送数据***************/
  BLEDataSend(event)
  {
    var that = this
    var hex = that.data.sendmsg  //要发送的信息

    console.log('要发送的信息是：'+hex)

    var typedArray = new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function (h) {
      return parseInt(h, 16)
    }))

    console.log(typedArray)

    var buffer1 = typedArray.buffer

    wx.writeBLECharacteristicValue
    ({
      deviceId: that.data.connectedDeviceId,
      serviceId: that.data.services[0].uuid,
      characteristicId: that.data.writeCharacteristicsId,

      // 这里的value是ArrayBuffer类型
      value: buffer1,

      success: function (res) 
      {
        console.log('写入成功', res.errMsg)
      },
      fail(res)
      {
        console.log('写入失败', res.errMsg)
      }
    })
  },
 
  /****************12.断开蓝牙的连接***************/
  BLEDisconnect(event)
  {
    var that = this;
    wx.closeBLEConnection
    ({
        deviceId: that.data.connectedDeviceId,
        success: function (res) 
        {
          that.setData
          ({
            connectedDeviceId: "",
          })
          console.log('断开蓝牙设备成功：' + res.errMsg)
        },
        fail:function(res)
        {
          console.log('断开蓝牙设备失败：' + res.errMsg)
        }
    })
  },


  //获取输入框的数据
  getmsg(event){
    this.setData({
      sendmsg:event.detail.value
    })
    
  },
  // ArrayBuffer转16进度字符串示例
  ab2hex(buffer) {
    var hexArr = Array.prototype.map.call(
      new Uint8Array(buffer),
      function (bit) {
        return ('00' + bit.toString(16)).slice(-2)
      }
    )
    return hexArr.join(',');
  },
  

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})